import numpy as np
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import LabelEncoder

# 1. 定义数据集
# 特征: 年龄 (0:年轻, 1:年老), 视力 (0:正常, 1:近视)
X = np.array([[0, 0],  # 样本1
              [0, 1],  # 样本2
              [1, 0],  # 样本3
              [1, 1],  # 样本4 (修改后)
              [1, 0],  # 样本5
              [0, 1]]) # 样本6

# 标签: 喜欢电脑游戏 (1:是, -1:否)
y = np.array([1, 1, -1, 1, -1, 1])

# 2. 创建 AdaBoost 分类器
# 使用决策树桩（max_depth=1）作为弱学习器，我们迭代2轮
ada_clf = AdaBoostClassifier(
    DecisionTreeClassifier(max_depth=1), # 弱学习器：决策树桩
    n_estimators=2,                      # 弱学习器的最大数量
    algorithm="SAMME.R",
    random_state=42
)

# 3. 训练模型
ada_clf.fit(X, y)

# 4. 查看模型细节
print("弱学习器权重:", ada_clf.estimator_weights_)
print("模型在训练集上的准确率: {:.2f}%".format(ada_clf.score(X, y) * 100))

# 5. 预测一个新样本
# 例如：一个【年老，视力正常】的人
new_person = np.array([[1, 0]])
prediction = ada_clf.predict(new_person)
prediction_proba = ada_clf.predict_proba(new_person)

print("\n预测新样本 [年老, 正常]:")
print("类别:", "喜欢" if prediction[0] == 1 else "不喜欢")
print("概率分布:", prediction_proba)

# 6. (可选) 查看每个弱学习器的预测
print("\n每个弱学习器的决策路径:")
for i, estimator in enumerate(ada_clf.estimators_):
    print(f"h{i+1}: {estimator.predict(new_person)}")